#ifndef LOGGER_APP_H
#define LOGGER_APP_H

#include <string>
#include <cstdio>
#include <ctime>
#include <sys/time.h>
#include <memory>
#include <esp_system.h>
#include <vector>
#include <esp_wifi.h>
#include "config/settings.h"

// WiFi扫描结果结构
struct WifiScanResult {
    std::string ssid;
    int32_t rssi;
    std::string auth_mode;
};

// 简单的日志条目结构（100字节）
struct SimpleLogEntry {
    char message[100];       // 100字节 - 存储完整原始日志消息（包含时间戳）
    // 总计100字节
};

/**
 * @brief 简单的MQTT消息日志记录器
 * 专门用于记录MQTT消息的topic和内容，以及系统统计信息
 */
class LoggerApp {
public:

    /**
     * @brief 获取单例实例
     */
    static LoggerApp& GetInstance() {
        static LoggerApp instance;
        return instance;
    }

    // 删除拷贝构造函数和赋值运算符
    LoggerApp(const LoggerApp&) = delete;
    LoggerApp& operator=(const LoggerApp&) = delete;

    bool start();

    void log(const std::string& topic, const std::string& payload);

    // 统计记录相关方法
    void RecordNvsWrite();          // 记录NVS写入次数
    void RecordWifiError();         // 记录WiFi错误
    void RecordMqttError();         // 记录MQTT错误
    void RecordRelayError();        // 记录继电器错误
    void RecordSystemWarning();     // 记录系统警告
    void RecordOtaAttempt();        // 记录OTA尝试
    void RecordOtaError();          // 记录OTA失败

    // WiFi信息记录方法
    void RecordWifiScanResults(const std::vector<WifiScanResult>& scan_results);  // 记录WiFi扫描结果
    void RecordConfiguredSsids(const std::vector<std::string>& ssid_list);        // 记录已配置SSID列表

    // 新增：日志缓冲区相关方法
    void InitializeLogCapture();                    // 初始化日志捕获
    void AddLogEntry(const char* message);          // 添加日志条目
    void SendLogData(size_t max_count = 50);        // 发送日志数据
    void ClearLogBuffer();                          // 清空日志缓冲区

private:
    LoggerApp();
    ~LoggerApp() = default;
    
    //必须是静态，C++的类中的函数自带this，只有静态不带，符合c风格
    static void MqttLog(const char* topic, const char* payload, size_t length, void* user_data);
    
    // 处理统计指令
    void HandleStatsCommand(const std::string& payload);
    
    // 发送统计信息
    void SendStatistics();
    
    // 重置统计数据
    void ResetStatistics();

    // 重启相关方法
    void InitializeRebootInfo();        // 初始化重启信息
    void SaveRebootCount();             // 保存重启次数
    std::string GetResetReasonString(esp_reset_reason_t reason);  // 获取重启原因字符串

    // 新增：自定义日志输出函数
    static int CustomLogOutput(const char* format, va_list args);

    // 统计变量 - 使用普通变量
    uint32_t nvs_write_count_ = 0;          // NVS实际写入次数
    uint32_t wifi_error_count_ = 0;         // WiFi错误次数
    uint32_t mqtt_error_count_ = 0;         // MQTT错误次数
    uint32_t relay_error_count_ = 0;        // 继电器错误次数
    uint32_t system_warning_count_ = 0;     // 系统警告次数
    uint32_t ota_attempt_count_ = 0;        // OTA尝试次数
    uint32_t ota_error_count_ = 0;          // OTA失败次数
    
    // WiFi信息变量
    std::vector<WifiScanResult> wifi_scan_results_;     // WiFi扫描结果
    std::vector<std::string> configured_ssids_;         // 已配置的SSID列表
    uint32_t last_wifi_scan_time_ = 0;                  // 上次WiFi扫描时间
    
    // 重启相关变量
    uint32_t reboot_count_ = 0;             // 重启次数
    esp_reset_reason_t last_reset_reason_;  // 上次重启原因
    
    // 启动时间记录
    uint32_t start_time_;
    
    // 主题
    char stats_topic_[64];
    char log_topic[40];
    // Settings实例用于保存重启次数
    std::unique_ptr<Settings> settings_;

    // 新增：日志缓冲区相关变量
    static constexpr size_t LOG_BUFFER_SIZE = 250;
    SimpleLogEntry log_entries_[LOG_BUFFER_SIZE];   // 固定数组：25KB
    size_t log_write_index_ = 0;                    // 写入索引
    size_t log_count_ = 0;                          // 当前日志数

    // void HandleDeviceCommand(const std::string& topic, const std::string& payload);
};

#endif // LOGGER_APP_H 